#include<iostream>
#include<unistd.h>
#include<signal.h>
#include<sys/types.h>
#include<sys/wait.h>

// void handler(int signo)
// {
//     std::cout<<"child quit,father get a signo:"<<signo<<std::endl;
// }

// void CleanupChild(int signo)
// {
    //1:
    // if(signo== SIGCHLD)
    // {
    //     //pid = -1等待任何进程
    //     pid_t rid = waitpid(-1,nullptr,0);
    // }
    // std::cout<<"wait sub process done"<<std::endl;
   //2:
    // if(signo ==SIGCHLD)
    // {
    //     while (true)
    //     {
    //         pid_t rid = waitpid(-1,nullptr,0);//回收任意子进程
    //        if(rid>0)
    //        {
    //             std::cout<<"wait child successL"<<rid<<std::endl;
    //        } 
    //        else if(rid<=0)
    //        {
    //             break;
    //        }
    //     }
    //std::cout<<"wait sub process done"<<std::endl;    
    // }
    //3:
//     if(signo==SIGCHLD)
//     {
//         while (true)
//         {
//             pid_t rid =waitpid(-1,nullptr,WNOHANG);
//             if(rid>0)
//             {
//                 std::cout<<"wait child success"<<rid<<std::endl;
//             }
//             else if(rid<=0)
//             {
//                 break;
//             }
//         }
//         std::cout<<"wait sub process done "<<std::endl;
//     }

// }
int main()
{

    //捕捉
    signal(SIGCHLD,SIG_IGN);
    for(int i = 0;i<100;i++)
    {
        //创建子进程
        pid_t id = fork();
        if(id==0)
        {
            int cnt = 5;
            while (cnt--)
            {
                std::cout<<"T am child process"<<getpid()<<std::endl;
                sleep(1);
            }
            std::cout<<"child process died"<<std::endl;
            exit(0);
            
        }
    }
    //父进程
    while (true)
    {
        sleep(1);    
    }
    
}


// void Print(sigset_t &pending)
// {
//     for (int sig  = 31; sig >= 1; sig--)
//     {
//         if(sigismember(&pending,sig))
//         {
//             std::cout<<"1";
//         }
//         else
//         {
//             std::cout<<"0";
//         }
//         std::cout<<"\n";
//     }
    
// }
// void handler(int sig)
// {
//     //不断获取挡墙进程的pending信号集合
//     sigset_t pending;
//     sigemptyset(&pending);
//     while (true)
//     {
//         sigpending(&pending);
//         Print(pending);
//     }
    
// }
// int main()
// {
//     struct sigaction act,oact;
//     //指向信号处理函数的指针
//     act.sa_handler = handler;
//     //用于设置信号处理的各种选项
//     act.sa_flags = 0;
//     //初始化信号集将信号集中的所有信号清空，不阻塞任何信号
//     //信号处理执行时，但是阻塞额外信号
//     sigemptyset(&act.sa_mask);
//     //将特定的信号添加到信号集中
//     //一下3 4 5 是特定信号
//     sigaddset(&act.sa_mask,3);
//     sigaddset(&act.sa_mask,4);
//     sigaddset(&act.sa_mask,5);
//     //指定处理2号信号，新信号处理，保存就的信号处理方式
//     sigaction(2,&act,&oact);
//     while (true)
//     {
//         sleep(1);
//     }
    
//     return 0;
// }